package java_class;

import java_heap.MinHeap;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 大量数据，取得top1000
 */
public class demo003 {

//    // 生成随机数
//    public static void main(String[] arge) throws IOException {
//        // 取得文件
//        FileWriter file = new FileWriter("E:\\workspace\\data\\number.txt");
//        for (int i = 0; i < 10000000; i++) {
//            if(i%100 == 0) System.out.println(i);
//            file.write(String.format("%020d", (long) (Math.random() * Long.MAX_VALUE)));
//            file.write("\n");
//            file.flush();
//        }
//    }

    /**
     * 读取并取出top100
     */
    public static void main(String[] arge) throws IOException {
        sort();
    }

//    // 排序
//    public static void sort() throws IOException {
//        Date start = new Date();
//        System.out.println("开始时间:" + start.getTime());
//        // 读取所有数据
//        FileReader file = new FileReader("E:\\workspace\\data\\number.txt");
//        BufferedReader bf = new BufferedReader(file);
//        String line;
//        List<Long> data = new ArrayList<>();
//        while ((line = bf.readLine()) != null) {
//            data.add(Long.valueOf(line));
//        }
//        bf.close();
//        file.close();
//
//        // 分治法处理
//        data = process(data, 100);
//
//        Date end = new Date();
//        System.out.println("结束时间:" + end.getTime());
//        System.out.println("用时:" + (end.getTime() - start.getTime()));
////        System.out.println(data.stream().sorted((s1, s2) -> s1.compareTo(s2)).collect(Collectors.toList()));
//    }
//
//    /**
//     * 分治法排序
//     */
//    public static List<Long> process(List<Long> data, int num) throws IOException {
//        if(data.size() == num) return data;
//        // 随机选择基准值
//        Long base = data.get((int)(Math.random() * data.size()));
//        // 遍历根据基准值划分
//        List<Long> tempBig = new ArrayList<>();
//        List<Long> tempSamll = new ArrayList<>();
//        for (int i = 0; i < data.size(); i++) {
//            if(data.get(i) >= base){
//                tempBig.add(data.get(i));
//            }else {
//                tempSamll.add(data.get(i));
//            }
//        }
//        // 递归
//        if(tempBig.size() > num){
//            process(tempBig, num);
//        }else if(tempBig.size() < num) {
//            process(tempSamll, num - tempBig.size());
//        }
//        return tempBig;
//    }


    // 排序
    public static void sort() throws IOException {
        Date start = new Date();
        System.out.println("开始时间:" + start.getTime());
        // 读取所有数据
        FileReader file = new FileReader("E:\\workspace\\data\\number.txt");
        BufferedReader bf = new BufferedReader(file);
        String line;
        // 堆使用
        MinHeap MinHeap = new MinHeap(1024);

        List<Long> data = new ArrayList<>();
        while ((line = bf.readLine()) != null) {
            if (MinHeap.size() < 1000){
                MinHeap.add(Long.valueOf(line));
            }else if(Long.valueOf(line) > MinHeap.findMin()){
                MinHeap.add(Long.valueOf(line));
                MinHeap.extractMin();
            }
        }
        bf.close();
        file.close();

        Date end = new Date();
        System.out.println("结束时间:" + end.getTime());
        System.out.println("用时:" + (end.getTime() - start.getTime()));
    }
}
